package com.niit.mall.common.api;


/**
 * 通用返回结果类
 * <p>
 * 用于封装各类操作的返回结果，包含状态码、提示信息以及数据内容。
 *
 * @param <T> 数据类型参数
 * @author ChuXuan
 * @date 2025/06/09
 */

public class CommonResult<T> {
	/**
	 * 状态码
	 */
	private long code;
	/**
	 * 提示信息
	 */
	private String message;
	/**
	 * 数据封装
	 */
	private T data;
	
	protected CommonResult() {
	}
	
	/**
	 * 构造方法，用于创建带有状态码、消息和数据的通用结果对象
	 *
	 * @param code    状态码
	 * @param message 描述信息
	 * @param data    数据内容
	 */
	protected CommonResult(long code, String message, T data) {
		this.code = code;
		this.message = message;
		this.data = data;
	}
	
	/**
	 * 成功返回结果
	 *
	 * @param data 获取的数据
	 */
	public static <T> CommonResult<T> success(T data) {
		return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
	}
	
	/**
	 * 成功返回结果
	 *
	 * @param data    获取的数据
	 * @param message 提示信息
	 */
	public static <T> CommonResult<T> success(T data, String message) {
		return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);
	}
	
	/**
	 * 失败返回结果
	 * @param errorCode 错误码
	 */
	public static <T> CommonResult<T> failed(IErrorCode errorCode) {
		return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);
	}
	
	/**
	 * 失败返回结果
	 * @param errorCode 错误码
	 * @param message 错误信息
	 */
	public static <T> CommonResult<T> failed(IErrorCode errorCode, String message) {
		return new CommonResult<T>(errorCode.getCode(), message, null);
	}
	
	/**
	 * 失败返回结果
	 * @param message 提示信息
	 */
	public static <T> CommonResult<T> failed(String message) {
		return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);
	}
	
	/**
	 * 失败返回结果
	 */
	public static <T> CommonResult<T> failed() {
		return failed(ResultCode.FAILED);
	}
	
	/**
	 * 参数验证失败返回结果
	 */
	public static <T> CommonResult<T> validateFailed() {
		return failed(ResultCode.VALIDATE_FAILED);
	}
	
	/**
	 * 参数验证失败返回结果
	 * @param message 提示信息
	 */
	public static <T> CommonResult<T> validateFailed(String message) {
		return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);
	}
	
	/**
	 * 未登录返回结果
	 */
	public static <T> CommonResult<T> unauthorized(T data) {
		return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
	}
	
	/**
	 * 未授权返回结果
	 */
	public static <T> CommonResult<T> forbidden(T data) {
		return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
	}




	//==========================================================================================//
	public long getCode() {
		return code;
	}
	
	public void setCode(long code) {
		this.code = code;
	}
	
	public String getMessage() {
		return message;
	}
	
	public void setMessage(String message) {
		this.message = message;
	}
	
	public T getData() {
		return data;
	}
	
	public void setData(T data) {
		this.data = data;
	}
}

